#ifndef CCGAMEWND_H
#define CCGAMEWND_H

#include <QFrame>
#include "ccitem.h"
#include "client.h"

class CCGameWnd : public QFrame
{
    Q_OBJECT
public:
    explicit CCGameWnd(QWidget *parent = nullptr);

    void Connect(QString ip, int port, int room);        //调用客户端ConnectToServer函数，传参主窗口上的ip，端口，房间号
    void Say(QString text);                              //调用客户端SendMsg_Say函数，传参输入框的text
    void Output(QString text);                           //发送输出信号（客户端调用）
    void GetRoomState(QList<ROOM_STATE>& state);         //调用客户端GetRoomState函数，传参房间状态列表

    void InitItems();                                    //初始化所有棋子
    void DrawChessboard();                               //画棋盘
    void DrawItems(CCItem item);                         //画棋子

    //获取棋子能移动的区域
    void GetMoveArea(CCItem item, QVector<QPoint>& area);
    void GetMoveArea_JU(CCItem item, QVector<QPoint>& area);
    void GetMoveArea_MA(CCItem item, QVector<QPoint>& area);
    void GetMoveArea_XIANG(CCItem item, QVector<QPoint>& area);
    void GetMoveArea_SHI(CCItem item, QVector<QPoint>& area);
    void GetMoveArea_SHUAI(CCItem item, QVector<QPoint>& area);
    void GetMoveArea_PAO(CCItem item, QVector<QPoint>& area);
    void GetMoveArea_BING(CCItem item, QVector<QPoint>& area);

    bool FindItemAtPoint(QPoint pt, CCItem& item);              //给定一个棋盘上的点，查找是否存在棋子
    bool DeleteItemAtPoint(QPoint pt, bool& bDeleteSHUAI);		//bDeleteSHUAI：是否打掉的是“帅”或“将”
    void SetItemShow(CCItem item, bool bShow);                  //设置棋子显隐
    void ChangeItemPoint(QPoint ptItem, QPoint pt);				//改变棋子位置属性

signals:
    void sigOutput(QString text);                        //TextEdit输出text信号
    void sigUpdateRoomState();                           //更新房间状态信号

public slots:
    void slotOtherUserMove(int x1, int y1, int x2, int y2);                //其他玩家行动槽函数
    void slotNewGame();                                  //新游戏槽函数

protected:
    void paintEvent(QPaintEvent*);                      //重写绘图事件
    void mousePressEvent(QMouseEvent* e);                //重写鼠标按压事件
    void timerEvent(QTimerEvent*);                      //重写定时器事件

private:
    //棋盘行、列数，以及每个单元格尺寸
    const int chessRows = 9;
    const int chessColumes = 8;
    const int rectWidth = 55;
    const int rectHeight = 56;

    const int startX = (36 - rectWidth / 2);//棋盘左上定点像素值（35，45），棋盘的格子大小（96，96）
    const int startY = (45 - rectHeight / 2);

    const QString chessBoardPath = ":/image/ChessBoard.png";
    const QString itemPath = ":/image/items.png";

    int mItemWidth;             //棋子的宽
    int mItemHeight;            //棋子的高
    QPixmap mItemImage;         //棋子图片

    CCItem mSelectedItem;       //选中的棋子
    bool mIsExistSelect;        //是否已存在选中的棋子

    Client* mClient;            //客户端
    QVector<CCItem> mItems;     //所有棋子
    bool mRed;                  //当前该什么颜色的棋方下，红棋为1，黑棋为0
    QPoint mPos;                //最后落下的棋子的坐标
};

#endif // CCGAMEWND_H
